 # -*- coding: UTF-8 -*-

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
import os

#~ def ruta_media(instance, filename):
    #~ return os.path.join('img/promo', str(instance.promocion.id), filename)

# Error genérico
class avnError (Exception):
     def __init__(self, value):
          self.value=value
     def __str__(self):
          return repr(self.value)
          
TIPO_MEDIA = (
     ('F', 'Foto fondo'),
     ('FC', 'Foto contenido corporativo'),
     ('FP', 'Foto contenido'),
     ('P', 'Plano'),
     ('PDF', 'PDF')
)     

class Media (models.Model):
     file = models.FileField(upload_to = 'img/u/')
     thumbnail = models.CharField(max_length = 255, editable = False, blank = True, null = True)
     tipo = models.CharField(max_length = 3, choices = TIPO_MEDIA)
     descripcion = models.CharField(max_length = 100, blank = True, null = True)
     inicial = models.NullBooleanField()
     asignado = models.NullBooleanField()
     orden = models.IntegerField(blank = True, null = True)

     def __unicode__(self):
          coda = ''
          if self.inicial:
               coda = '. En portada.'
          return self.get_tipo_display()  + u' número ' + str(self.id) + ' (' + self.descripcion[:20] + '...)' + coda

     def save(self, *args, **kwargs):
          super(Media, self).save(*args, **kwargs)

          if (self.tipo != 'PDF'):               
          
               if self.tipo == 'F':
                    size = (120, 75)
                    self.thumbnail = 'img/u/' +imgresize(unicode(self.file.path), size, 'thumb')

               elif  self.tipo == 'P':
                    size = (165, 234)
                    self.thumbnail = 'img/u/' +imgresize(unicode(self.file.path), size, 'thumb')
                    size = (496, 702)
                    imgresize(unicode(self.file.path), size, 'rsize')             
                    
               elif self.tipo in ('FP','FC'):
                    size = (350, 275)
                    imgresize(unicode(self.file.path), size, 'crop')                    
               
               super(Media, self).save(*args, **kwargs)
     
     def delete(self, *args, **kwargs):
          if self.tipo in ('F', 'P'):
               os.remove(settings.MEDIA_ROOT + self.thumbnail)
          super(Media, self).delete(*args, **kwargs)

     class Admin:
          pass

     class Meta:
          verbose_name='Elemento multimedia'
          verbose_name_plural='Elementos multimedia'

class Menu (models.Model):
     nombre = models.CharField(max_length = 100, unique = True)
     uri = models.CharField(max_length = 255, blank = True, null = True)
     clase = models.CharField(max_length = 50, blank = True, null = True)
     title = models.CharField(max_length = 50, blank = True, null = True)
     padre = models.ForeignKey('self', blank = True, null = True)
     orden = models.IntegerField()
     
     def __unicode__(self):
          return str(self.orden) + '-' + self.nombre
          
     class Meta:
          verbose_name='menú'
          verbose_name_plural='menús'
          ordering = ['orden']
          
class Promocion (models.Model):
     nombre = models.CharField(max_length = 25, unique = True)
     descripcion = models.TextField('Descripción', blank = True)
     memoria = models.TextField('Memoria de calidades', blank = True)
     fecha = models.DateField('Fecha de inicio')
     direccion = models.CharField('Dirección', max_length = 100)
     cp = models.CharField('Código postal', max_length = 5, blank = True)
     localidad = models.CharField(max_length = 50)
     vigente = models.NullBooleanField('Sigue a la venta')
     enmenu = models.NullBooleanField('Visible en menú')
     orden = models.IntegerField(null = True)
     lat = models.CharField(max_length = 100, editable = False, blank = True, null = True)
     lng = models.CharField(max_length = 100, editable = False, blank = True, null = True)
     
     def save(self, *args, **kwargs):
          if not self.vigente and self.orden < 1000:
               self.orden += 1000
          renumera(Promocion, self.orden) 
          from avanzaweb.views import geocode
          self.lat, self.lng = geocode(self.direccion +' ' + self.cp + ' ' + self.localidad)
          super(Promocion, self).save( *args, **kwargs)
          
          # Arreglar el menú
          pare = Menu.objects.get(nombre='Viviendas en venta') #Menú "Viviendas en venta" se tiene que llamar así
          Menu.objects.filter(padre = pare).delete()
          for p in Promocion.objects.filter(enmenu = True):
               cls = 'anterior'
               tit = 'Vendida'
               orden = p.orden
               if p.vigente:
                    cls = 'actual'
                    tit = 'En venta'
               else:
                    if orden < 1000:
                         orden += 1000
               #m = Menu(nombre = p.nombre,  uri = '/promo/' + str(p.id), clase = cls, title = tit,padre = pare, orden = p.orden) 
               m = Menu(nombre = p.nombre,  uri = '/vivienda/' + str(p.id), clase = cls, title = tit,padre = pare, orden = orden)
               m.save()
          
     def __unicode__(self):
          return self.nombre + '. Orden: ' + str(self.orden)
          
     class Meta:
          verbose_name='promoción'
          verbose_name_plural='promociones'
          ordering = ['orden']
          
class Promocion_Media (models.Model):
     promocion = models.ForeignKey(Promocion)
     media = models.ForeignKey(Media, limit_choices_to = {'asignado' : False, 'inicial' : False })
     descripcion = models.CharField(max_length = 100, blank = True, null = True)
     orden = models.IntegerField()

     def __unicode__(self):
          return self.media.get_tipo_display()  + u' número ' + str(self.id) + u' de la promoción: ' + self.promocion.nombre
     
     class Meta:
          verbose_name='elementos multimedia de una promoción'
          verbose_name_plural='elementos multimedia de una promoción'
          unique_together=('promocion', 'media')
          
     def save(self, *args, **kwargs):
          renumera(Promocion_Media, self.orden) 
          super(Promocion_Media, self).save( *args, **kwargs)
          self.media.asignado = True

class Pagina (models.Model):
     nombre = models.CharField(max_length = 100, unique = True)
     titulo = models.CharField(max_length = 100, blank = True)     
     orden = models.IntegerField()
     menu = models.ForeignKey(Menu)
     
     def __unicode__(self):
          return self.menu.nombre + '-' + self.nombre
          
     class Meta:
          verbose_name='página'
          verbose_name_plural='páginas'
          ordering = ['orden']
     
class Contenido (models.Model):
     pagina = models.ForeignKey(Pagina)
     titulo = models.CharField(max_length = 100, blank = True) 
     texto = models.TextField()
     fecha = models.DateTimeField(auto_now_add=True, blank=True, null = True)
     clase_css = models.CharField(max_length = 100, blank = True)
     orden = models.IntegerField()
     
     def __unicode__(self):
          return self.titulo if self.titulo else u'Contenido nº ' + str(self.orden) + ' - ' + self.pagina.nombre
     
     class Meta:
          verbose_name='contenido'
          verbose_name_plural='contenidos'
          ordering = ['orden']
     
     def save(self, *args, **kwargs):
          if self.orden == None:
               from django.db.models import Max
               mx = Contenido.objects.filter(pagina = self.pagina).aggregate(Max('orden'))
               self.orden = mx['orden__max'] + 1
          super(Contenido, self).save( *args, **kwargs)
                    
class Contenido_Media (models.Model):
     contenido = models.ForeignKey(Contenido)
     media = models.ForeignKey(Media, limit_choices_to={'tipo': 'FC',})
     descripcion = models.CharField(max_length = 100, blank = True, null = True)
     orden = models.IntegerField()

     def __unicode__(self):
          return self.media.get_tipo_display()  + u' número ' + str(self.id) + u' del contenido: ' + self.contenido.titulo
          
     class Meta:
          verbose_name='Elementos multimedia de un contenido'
          verbose_name_plural='Elementos multimedia de un contenido'
          unique_together=('contenido', 'media')
          ordering = ['orden']
          
          
     def save(self, *args, **kwargs):
          if self.orden == None:
               from django.db.models import Max
               mx = Contenido_Media.objects.filter(Contenido = self.contenido).aggregate(Max('orden'))
               self.orden = mx['orden__max'] + 1
          super(Contenido_Media, self).save( *args, **kwargs)
          
class Pagina_Media (models.Model):
     pagina = models.ForeignKey(Pagina)
     media = models.ForeignKey(Media, limit_choices_to={'tipo': 'FC',})
     descripcion = models.CharField(max_length = 100, blank = True, null = True)
     orden = models.IntegerField()

     def __unicode__(self):
          return self.media.get_tipo_display()  + u' número ' + str(self.id) + u' de la  página: ' + self.pagina.nombre
          
     class Meta:
          verbose_name='Elementos multimedia de una página'
          verbose_name_plural='Elementos multimedia de una página'
          unique_together=('pagina', 'media')
     
class Opciones():
     OPT_1A10 =(
          (10, '10'),
          (9, '9'),
          (8, '8'),
          (7, '7'),
          (6, '6'),
          (5, '5'),
          (4, '4'),
          (3, '3'),
          (2, '2'),
          (1, '1')
     )     
                    
     OPT_TRATO = (
          (10, 'Impecable'),
          (7, 'Amable'),
          (6, 'Cuidadosa'),
          (5, 'No la recuerdo'),
          (2, 'Descuidada'),
          (1, 'Descortés'),
          (0, 'Nefasta')
     )     
            
     OPT_MEJORAS = (
          (0, 'Ninguno'),
          (1 ,'Paredes'),
          (2,'Suelos'),
          (3 ,'Instalación sanitaria'),
          (4 ,'Cañerías'),
          (5 ,'Aislamientos'),
          (6 ,'Ventanas')
     )
     
     OPT_CALIDAD = (
          (10 ,'Excelente'),
          (8,'Buena'),
          (5,'Ordinaria'),
          (4,'Mejorable'),
          (0,'Nefasta')
     )
     
     OPT_SINO = (
          (0 ,'No'),
          (1,'Sí')
     )

class Survey (models.Model):
     fecha = models.DateField()
     ip = models.CharField(max_length = 20)
     usuario = models.ForeignKey( User )
     promocion = models.ForeignKey(Promocion)
     internetant = models.IntegerField(choices = Opciones.OPT_1A10)
     internetnew = models.IntegerField(choices = Opciones.OPT_1A10)
     trato = models.IntegerField(choices = Opciones.OPT_TRATO)
     estudio = models.NullBooleanField()
     satis_plan = models.IntegerField(choices = Opciones.OPT_1A10)
     satis_viv = models.IntegerField(choices = Opciones.OPT_1A10)
     mejoras = models.IntegerField(choices = Opciones.OPT_MEJORAS)
     otros_mejoras = models.TextField(blank = True, null = True)
     obs_mejoras = models.TextField(blank = True, null = True)
     posventa = models.IntegerField(choices = Opciones.OPT_1A10)
     obs_posventa = models.TextField(blank = True, null = True)
     calidad_precio = models.IntegerField(choices = Opciones.OPT_CALIDAD)
     aspecto = models.TextField(blank = True, null = True)
     comentario = models.TextField(blank = True, null = True)
     publicada = models.NullBooleanField()
     pub_comentario =  models.NullBooleanField()

     def __unicode__(self):
          return u'Encuesta ' + str(self.id) + u' de la  promoción: ' + self.promocion.nombre
          
     class Meta:
          verbose_name='encuesta'
          verbose_name_plural='encuestas'

def imgresize (ruta, size, metodo):
     fullpath = os.path.dirname(ruta)  
     filename = os.path.splitext(os.path.split(ruta)[1])
     if filename[1].lower() in ['.jpg', '.jpeg', '.gif', '.png']:

          from PIL import Image
          image = Image.open(ruta)
          if (image.size[0] / image.size[1]) != (size[0] / size[1]):
               size = (size[1], size[0])
          # normalize image mode
          if image.mode != 'RGB':
               image = image.convert('RGB')
          
          if metodo == 'thumb':
               image.thumbnail(size, Image.ANTIALIAS)
               thumbname = 't' + filename[0] + ".jpg"
               image.save(fullpath + '/' + thumbname)
               return thumbname
          elif metodo == 'rsize':
               image.resize(size, Image.ANTIALIAS).save(ruta)
               return
          else: #crop
               import ImageOps
               ImageOps.fit(image, size, Image.ANTIALIAS, 0, (0.5, 0.5)).save(ruta, quality=80)
               return
     else:
          raise avnError('Imagen no válida')
          
def renumera(modelo, desde):
     modelo.objects.filter(orden__gte = desde).update(orden=models.F('orden') + 1)
